//////////////////////////////////////////////////////////////////////////
#pragma once
//////////////////////////////////////////////////////////////////////////
namespace hlp
{
//////////////////////////////////////////////////////////////////////////
template<class T>
struct zero
{
	static const T value;
};
template<>
struct zero<float>
{
	static const float value;
};
//////////////////////////////////////////////////////////////////////////
template<class T, int i, int j>
struct Matrix
{
	T m[i][j];
};
//////////////////////////////////////////////////////////////////////////
template<class T>
struct Point
{
	Point()
	:x(zero<T>::value)
	,y(zero<T>::value)
	{
	}
	Point(T _x, T _y)
	:x(_x)
	,y(_y)
	{
	}
	
	Point<T> operator+(const Point<T>& p) const
	{
		return Point<T>(x + p.x, y + p.y);
	}

	Point<T> operator-(const Point<T>& p) const
	{
		return Point<T>(x - p.x, y - p.y);
	}

	T x;
	T y;
};
//////////////////////////////////////////////////////////////////////////
typedef Point<float> Pointf;
typedef Matrix<float, 3, 3> Matrix33f;
//////////////////////////////////////////////////////////////////////////
Pointf transformPoint(const Pointf& pointIn, const Matrix33f& matrix);
//////////////////////////////////////////////////////////////////////////
bool   pointSegmentRatio(const Pointf& point, const Pointf& segmentA, const Pointf& segmentB);
//////////////////////////////////////////////////////////////////////////
}
//////////////////////////////////////////////////////////////////////////